package com.yingda.electronicscaleadvices.utils;

import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.text.TextUtils;

import androidx.core.content.FileProvider;

import java.io.File;

@TargetApi(Build.VERSION_CODES.KITKAT)
public class DocumentsHelper {

    public static String getPath(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }

                // handle non-primary volumes
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {

                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"),
                        Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }

                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{split[1]};

                return getDataColumn(context, contentUri, selection,
                        selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {

            // Return the remote address
            if (isGooglePhotosUri(uri)) {
                return uri.getLastPathSegment();
            }

            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context       The context.
     * @param uri           The Uri to query.
     * @param selection     (Optional) Filter used in the query.
     * @param selectionArgs (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    public static String getDataColumn(Context context, Uri uri,
                                       String selection, String[] selectionArgs) {

        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};

        try {
            cursor = context.getContentResolver().query(uri, projection,
                    selection, selectionArgs, null);
            if (cursor != null && cursor.moveToFirst()) {
                final int index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(index);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
        return null;
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri
                .getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri
                .getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri
                .getAuthority());
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is Google Photos.
     */
    public static boolean isGooglePhotosUri(Uri uri) {
        return "com.google.android.apps.photos.content".equals(uri
                .getAuthority());
    }


    /**
     * 是否启用Android N(7.0)的特性
     * 编译时TargetSDKVersion>=24&&运行时VERSION.SDK_INT >= 24
     * <p>
     * 目前该方法暂不启用[判断逻辑待完善]，仅做代码提交备份
     * 若要启动该特性相关的修改文件为：DocumentsHelper 和 MediaChoseActivity
     */
    private static boolean useAndroidN() {
        if (Build.VERSION.SDK_INT >= 24) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 根据文件名称，查找其文件路径
     */
    public static String getImgPathByName(Context ctx, String fileName) {
        String path = "";
        if (TextUtils.isEmpty(fileName)) {
            return path;
        }

        Cursor cursor = null;
        try {
            cursor = ctx.getContentResolver().query(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    new String[]{MediaStore.Images.Media.DATA},
                    MediaStore.Images.Media.DISPLAY_NAME + " = ?",
                    new String[]{fileName}, null);
            if (cursor != null && cursor.getCount() > 0) {
                cursor.moveToFirst();
                path = cursor.getString(0);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
                cursor = null;
            }
        }
        return path;
    }

    /**
     * 和getFileUrl方法的功能相同，仅对条件的检查放宽[不判断文件是否存在]
     * <p>
     * 在小米Android 7.0测试发现：在new File(path)对象后，再调用file.exists()总返回false;
     *
     * @param context
     * @param file
     * @return
     */
    public static Uri getImgCaptureUrl(Context context, File file) {
        if (file != null) {
            if (useAndroidN()) {
                Uri uri = FileProvider.getUriForFile(context,
                        context.getPackageName() + ".fileprovider", file);
                return uri;
            } else {
                Uri uri = Uri.fromFile(file);
                return uri;
            }
        }
        return null;
    }

    /**
     * 通过FileProvider方式将file访问的URI 由file://开头转换为content://;
     * 需要配合addUriPermission(Intent),给于访问授权；
     *
     * @param context
     * @param file
     * @return
     */
    public static Uri getFileUrl(Context context, File file) {
        if (context != null && file != null && file.exists()) {
            if (useAndroidN()) {
                Uri contentUri = FileProvider.getUriForFile(context,
                        context.getPackageName() + ".fileprovider", file);
                return contentUri;
            } else {
                Uri contentUri = Uri.fromFile(file);
                return contentUri;
            }
        }
        return null;
    }

    public static boolean addUriPermission(Intent intent) {
        if (intent != null) {
            if (useAndroidN()) {
                // 授予目录临时共享权限
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                return true;
            }
        }
        return false;
    }
}
